// 读入10个字符串或者读到EOF时结束
// 为用户提供一个有5个选项的菜单
// 1. 打印源字符串列表
// 2. 以ASCII中的顺序打印字符串
// 3. 按长度递增打印字符串
// 4. 按字符串中第一个单词的长度打印字符串
// 5. 退出

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define COUNT 10			// 行数
#define LIMIT 81			// 限制字符串长度

void sort_ASCII(char *strings[], int n);
void sort_length(char *strings[], int n);
// 返回长度为第一个单词的长度
int fwlen(char *string);
void sort_firstword_length(char *strings[], int n);
void print_menu(void);
char * get(char *string, int n);	//fgets一行数据并且删除'\n'
int main(void)
{
	char strings[COUNT][LIMIT];		// 存储输入的数组
	char *strptrs[COUNT];
	char * success;
	char ch;
//    int i;

	// 初始化数组指针
	for (int i = 0; i < COUNT; i++)
		strptrs[i] = strings[i];
	
	puts("输入10个字符串(EOF to stop): ");
	
	// 从输入中读取10个字符串
	for (int i = 0; i < COUNT; i++)
	{
		printf("%d: ", i + 1);
        success = get(strings[i], LIMIT);
		if (!success)
            break;
	}

	printf("\n");
	print_menu();
	while ((ch = getchar()) != 'q')
	{
		// 丢弃该行的其余部分，只留下一个字符
		if (ch != '\n')
			while (getchar() != '\n')
				continue;
		switch (ch)
		{
			case 'a':
				sort_ASCII(strptrs, COUNT);
				break;
			case 'l':
				sort_length(strptrs, COUNT);
				break;
			case 'f':
				sort_firstword_length(strptrs, COUNT);
				break;
			case 'o':
				break;
			default:
				printf("Invalid input. Try again.\n\n");
				print_menu();
				continue;
		}
		puts("");
		for (int i = 0; i < COUNT; i++)
			puts(strptrs[i]);

		puts("");
		print_menu();
	}
	puts("Bye");
	
	return 0;
}

void sort_ASCII(char *strings[], int n)
{
	char * tmp;
	// 选择排序
	for (int i = 0; i < n -1; i++)
		for (int j = i+1; j < n; j++)
			if ( strcmp(strings[i], strings[j] ) > 0 )	// strcmp('a', 'b') < 0
			{
				tmp = strings[i];
				strings[i] = strings[j];
				strings[j] = tmp;
			}
}
void sort_length(char *strings[], int n)
{
    char * tmp;
    for (int i = 0; i < n - 1; i++)
            for (int j = i + 1; j < n; j++)
            {
                if (strlen(strings[i]) > strlen(strings[j]))
                {
                    tmp = strings[i];
                    strings[i] = strings[j];
                    strings[j] = tmp;
                }
            }
}


int fwlen(char *string)
{
    int length = 0;

    while (isspace(*string))
        string++;

    while(!isspace(*string))
    {
        length++;
        string++;
    }

    return length;
}

void sort_firstword_length(char *strings[], int n)
{
    char *tmp;

    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
        {
            if (fwlen(strings[i]) > fwlen(strings[j]))
            {
                tmp = strings[i];
                strings[i] = strings[j];
                strings[j] = tmp;
            }
        }

}

char * get(char *string, int n)
{
	char * return_value = fgets(string, n, stdin);
	
	while (*string != '\0')
	{
		if (*string == '\n')
		{
			*string = '\0';
			break;
		}
		string++;
	}
	
	return return_value;
}

void print_menu(void)
{
	puts("o. 打印源字符串列表");
	puts("a. 按照ASCII字符顺序打印");
	puts("l. 按照长度打印字符串");
	puts("f. 按照字符串第一个单词的长度打印");
	puts("q. 退出");
	puts("");
	puts("输入选项: ");
}
